package com.pai4j.user.service.chat;

import com.pai4j.common.util.JsonUtil;
import com.pai4j.domain.vo.request.chat.UpdateUserChatSettingRequestVO;
import com.pai4j.domain.vo.response.chat.UserChatSettingResponseVO;
import com.pai4j.user.repository.dao.IUserChatSettingDAO;
import com.pai4j.user.repository.entity.UserChatSettingEntity;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Map;

@Service
public class UserChatSettingService {

    @Resource
    private IUserChatSettingDAO userChatSettingDAO;
    /**
     * 更新用户聊天设置信息
     * <p>
     * 根据请求中的 ownerAccount 和 peerAccount 查找对应的聊天设置记录，
     * 如果记录不存在则创建新记录，然后更新请求中非空的字段，并保存到数据库。
     *
     * @param req 包含需要更新的聊天设置信息的请求对象，包括：
     *            - ownerAccount: 拥有者账号（必填）
     *            - peerAccount: 对方账号（必填）
     *            - mute: 是否免打扰（可选）
     *            - pinned: 是否置顶（可选）
     *            - special: 是否特别关注（可选）
     *            - chatBackground: 聊天背景（可选）
     *            - remark: 备注（可选）
     *            - ext: 扩展字段（可选）
     * @return 更新成功返回 true
     */
    public boolean update(UpdateUserChatSettingRequestVO req) {
        // 查找或创建用户聊天设置实体
        UserChatSettingEntity entity = userChatSettingDAO.findByOwnerAccountAndPeerAccount(req.getOwnerAccount(), req.getPeerAccount());
        Date now = new Date();
        if (entity == null) {
            entity = new UserChatSettingEntity();
            entity.setOwnerAccount(req.getOwnerAccount());
            entity.setPeerAccount(req.getPeerAccount());
            entity.setCreateDate(now);
        }

        // 更新非空字段
        if (req.getMute() != null) entity.setMute(req.getMute());
        if (req.getPinned() != null) entity.setPinned(req.getPinned());
        if (req.getSpecial() != null) entity.setSpecial(req.getSpecial());
        if (req.getChatBackground() != null) entity.setChatBackground(req.getChatBackground());
        if (req.getRemark() != null) entity.setRemark(req.getRemark());
        if (req.getExt() != null) entity.setExt(map2json(req.getExt()));

        entity.setUpdateDate(now);
        userChatSettingDAO.save(entity);
        return true;
    }

    /**
     * 获取用户聊天设置信息
     * <p>
     * 根据 ownerAccount 和 peerAccount 查询对应的聊天设置记录，
     * 如果记录存在则转换为响应对象返回，否则返回 null。
     *
     * @param ownerAccount 拥有者账号
     * @param peerAccount  对方账号
     * @return 用户聊天设置信息响应对象，包含以下字段：
     *         - ownerAccount: 拥有者账号
     *         - peerAccount: 对方账号
     *         - mute: 是否免打扰
     *         - pinned: 是否置顶
     *         - special: 是否特别关注
     *         - chatBackground: 聊天背景
     *         - remark: 备注
     *         - ext: 扩展字段
     *         如果记录不存在则返回 null
     */
    public UserChatSettingResponseVO get(String ownerAccount, String peerAccount) {
        UserChatSettingEntity e = userChatSettingDAO.findByOwnerAccountAndPeerAccount(ownerAccount, peerAccount);
        if (e == null) return null;

        // 构建并返回响应对象
        return UserChatSettingResponseVO.builder()
                .ownerAccount(e.getOwnerAccount())
                .peerAccount(e.getPeerAccount())
                .special(e.getSpecial())
                .mute(e.getMute())
                .pinned(e.getPinned())
                .chatBackground(e.getChatBackground())
                .remark(e.getRemark())
                .ext(json2map(e.getExt()))
                .build();
    }

    /**
     * 将 Map 转换为 JSON 字符串
     *
     * @param map 需要转换的 Map 对象
     * @return 转换后的 JSON 字符串，如果 map 为 null 则返回 null
     */
    private String map2json(Map<String, Object> map) {
        return map == null ? null : JsonUtil.toJsonString(map);
    }

    /**
     * 将 JSON 字符串转换为 Map
     *
     * @param json 需要转换的 JSON 字符串
     * @return 转换后的 Map 对象，如果 json 为空则返回 null
     */
    @SuppressWarnings("unchecked")
    private Map<String, Object> json2map(String json) {
        return StringUtils.isBlank(json) ? null : JsonUtil.fromJson(json, Map.class);
    }

}
